package com.example;

import java.util.ArrayList;
import java.util.List;

/**
 * @author zhangs
 * @version v1.0
 * @decription 参数化类型测试
 * @date 2021/4/7 19:56
 **/
public class ConsumerAndProvider {
    public static void main(String[] args) {
        // 调用生产者方法
        List<String> strings = new ArrayList<String>() {{
            add("世界");
            add("你好");
        }};

        // 调用消费者方法，往strings中存放数据
        consumer(strings, "世界", "你好", "特别棒");

        // 调用生产者方法，将strings中的数据读取出来
        producer(strings);
    }

    public static <T> void producer(List<? extends T> produce) {
        // 从参数化类型中获取数据，参数化类型为生产者，使用extends
        produce.forEach(System.out::println);
    }

    @SafeVarargs
    public static <T> void consumer(List<? super T> list, T... ts) {
        // 往参数化类型中存放数据，参数化类型为消费者，使用super
        for (T t : ts) {
            list.add(t);
        }
    }

    public static <T> void consumerAndProducer(List<T> list, T... ts) {
        // 即读又写只能使用非参数化类型
        for (T t : ts) {
            list.add(t);
        }
        list.forEach(System.out::println);
    }
}
